// M-mode timer interrupt vector: 重新安排下一次触发，并向 S 态发软件中断（SSIP）

.section .text
.align 4
.globl timervec
timervec:
  // 读取 mscratch，获得 scratch 指针
  csrr t0, mscratch         // t0 = &scratch[0]
  ld   t1, 0(t0)            // t1 = mtimecmp 地址
  ld   t2, 8(t0)            // t2 = interval
  ld   t3, 16(t0)           // t3 = mtime 地址

  // 读取当前时间并设置下一次触发
  ld   t4, 0(t3)            // t4 = *mtime
  add  t4, t4, t2           // t4 = mtime + interval
  sd   t4, 0(t1)            // *mtimecmp = t4

  // 置位 mip.SSIP，向 S 态注入软件中断
  li   t5, (1 << 1)         // SSIP 位
  csrs mip, t5

  mret